home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 28
/
Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso
/
Aminet
/
dev
/
lang
/
fpc09905c.lha
/
fpc
/
inc
/
objinc.inc
< prev
next >
Wrap
Text File
|
1998-09-21
|
10KB
|
306 lines
{
$Id: objinc.inc,v 1.3 1998/07/13 12:31:40 carl Exp $
This file is part of the Free Pascal run time library.
Copyright (c) 1993-98 by the Free Pascal development team.
Includefile for objects.pp implementing OS-dependent file routines
for AmigaOS
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************
}
Const
_LVOFindTask = -294;
_LVOWaitPort = -384;
_LVOGetMsg = -372;
_LVOOpenLibrary = -552;
_LVOCloseLibrary = -414;
_LVOClose = -36;
_LVOOpen = -30;
_LVOIoErr = -132;
_LVOSeek = -66;
_LVODeleteFile = -72;
_LVORename = -78;
_LVOWrite = -48;
_LVORead = -42;
_LVOCreateDir = -120;
_LVOSetCurrentDirName = -558;
_LVOGetCurrentDirName = -564;
_LVOInput = -54;
_LVOOutput = -60;
_LVOUnLock = -90;
_LVOLock = -84;
_LVOCurrentDir = -126;
_LVONameFromLock = -402;
_LVONameFromFH = -408;
_LVOGetProgramName = -576;
_LVOGetProgramDir = -600;
_LVODupLock = -96;
_LVOExamine = -102;
_LVOParentDir = -210;
_LVOSetFileSize = -456;
{---------------------------------------------------------------------------}
{ FileClose -> Platforms AmigaOS - Not checked }
{---------------------------------------------------------------------------}
FUNCTION FileClose(Handle: THandle): word;
begin
asm
move.l handle,d1
move.l a6,d6 { save a6 }
move.l _DOSBase,a6
jsr _LVOClose(a6)
move.l d6,a6 { restore a6 }
end;
FileClose := 0;
end;
{---------------------------------------------------------------------------}
{ FileOpen -> Platforms AmigaOS - 08Jul98 CEC }
{ Returns 0 on failure }
{---------------------------------------------------------------------------}
FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): THandle;
var
oflags : longint;
AHandle : THandle;
begin
AHandle:=0;
{ On opening reset error code }
DosStreamError := 0;
if Mode=stCreate then
{ read/write file with creation of file }
oflags := 1006
else
{ read/write access on existing file }
oflags := 1005;
asm
move.l a6,d6 { save a6 }
move.l FileName,d1
move.l oflags,d2 { MODE_READWRITE }
move.l _DOSBase,a6
jsr _LVOOpen(a6)
tst.l d0
bne @noopenerror { on zero an error occured }
jsr _LVOIoErr(a6)
move.w d0,DosStreamError
bra @openend
@noopenerror:
move.l d6,a6 { restore a6 }
move.l d0,AHandle { we need the base pointer to access this variable }
bra @end
@openend:
move.l d6,a6 { restore a6 }
@end:
end;
FileOpen := AHandle;
end;
{***************************************************************************}
{ DosSetFilePtr -> Platforms AmigaOS - 08Jul98 CEC }
{***************************************************************************}
FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
Var Actual: LongInt): Word;
Var
Move_typ : longint;
BEGIN
Move_typ := 0;
{ Move from beginning of file }
if MoveType = 0 then
Move_typ := -1;
{ Move from current position of file }
If MoveType = 1 then
Move_typ := 0;
{ Move from end of file }
If MoveType = 2 then
Move_typ := 1;
{ We have to seek TWO times, if we wish to get the actual absolute }
{ file position normally. }
asm
move.l a6,d6 { Save base pointer }
move.l handle,d1
move.l d2,-(sp)
move.l d3,-(sp) { save registers }
move.l pos,d2
move.l Move_typ,d3 { Setup correct move type }
move.l _DOSBase,a6
jsr _LVOSeek(a6)
move.l (sp)+,d3 { restore registers }
move.l (sp)+,d2
cmp.l #-1,d0 { is there a file access error? }
bne @noerr_one { no, then seek a second time }
jsr _LVOIoErr(a6) { yes ,get error in d0 and jmp }
bra @err
@noerr_one: { Seek a second time }
move.l d6,a6 { Restore base pointer }
move.l handle,d1
move.l d2,-(sp)
move.l d3,-(sp) { save registers }
move.l pos,d2
move.l Move_typ,d3 { Setup correct move type }
move.l _DOSBase,a6
jsr _LVOSeek(a6)
move.l (sp)+,d3 { restore registers }
move.l (sp)+,d2
cmp.l #-1,d0 { is there a file access error? }
bne @noerr
jsr _LVOIoErr(a6)
@err:
move.w d0,DosStreamError
move.l d6,a6 { restore a6 }
bra @seekend
@noerr:
move.l d6,a6 { restore a6 }
move.l Actual,a0 { Get address of variable }
move.l d0,(a0) { Set value of Actual }
@seekend:
end;
SetFilePos := DosStreamError; { Return any error }
END;
{---------------------------------------------------------------------------}
{ FileRead -> Platforms AmigaOS - 08Jul98 CEC }
{---------------------------------------------------------------------------}
FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word;
Var Actual: Sw_Word): Word;
BEGIN
if Count <= 0 then
Begin
FileRead:=1; { Return a non zero error }
exit;
end;
asm
move.l a6,d6
movem.l d2/d3,-(sp)
move.l handle,d1 { we must set up aparamters BEFORE }
move.l buf,d2 { setting up a6 for the OS call }
move.l count,d3
move.l _DOSBase,a6
jsr _LVORead(a6)
movem.l (sp)+,d2/d3
cmp.l #-1,d0
bne @doswrend { if -1 = error }
jsr _LVOIoErr(a6)
move.w d0,DosStreamError
bra @doswrend2
@doswrend:
{ to store a result for the function }
{ we must of course first get back the}
{ base pointer! }
move.l d6,a6
move.l Actual,a0 { Actual is a pointer! }
move.l d0,(a0)
bra @end
@doswrend2:
move.l d6,a6
@end:
end;
FileRead:=DosStreamError;
end;
{---------------------------------------------------------------------------}
{ FileWrite -> Platforms AmigAOS - 08Jul98 CEC }
{---------------------------------------------------------------------------}
FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
BEGIN
if Count <= 0 then
Begin
FileWrite:=1; { Return a non zero error code }
exit;
end;
asm
move.l a6,d6
movem.l d2/d3,-(sp)
move.l handle,d1 { we must of co